package xyz.lisys.service.impl;

import org.springframework.scheduling.annotation.Scheduled;
import xyz.lisys.service.ScheduledService;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;

public class ScheduledServiceImpl implements ScheduledService {
    private int count;
    private final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd : HH mm ss");

    // 注意，定时任务默认情况下不会并行运行，在前一个任务完成之前也不会调用下一个任务。
    // 如果想在定时任务中支持并行行为，就需要添加 @Async 注解

    @Scheduled(cron = "0/5 * * * * ?")
    public void sayHello2() {
        // 注意，定时任务默认情况下不会并行运行，在前一个任务完成之前也不会调用下一个任务。
        // 如果想在定时任务中支持并行行为，就需要添加 @Async 注解

        // {秒数} {分钟} {小时} {日期} {月份} {星期}
        // {日期}和{星期}可以使用 ? 来实现互斥，表达无意义的信息
        try {
            TimeUnit.SECONDS.sleep(10);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println(simpleDateFormat.format(new Date()) + ":" + Thread.currentThread().getName() + "： " + ScheduledServiceImpl.class.getName() + ": say hello2 " + count++);
    }

    @Scheduled(fixedDelay = 5000)
    // @Scheduled(cron = "0/5 * * * * ?")
    public void sayHello3() {
        try {
            TimeUnit.SECONDS.sleep(10);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        // 可确保任务执行结束时间与下一次任务执行开始时间之间有 n 毫秒的延迟
        System.out.println(simpleDateFormat.format(new Date()) + ":" + Thread.currentThread().getName() + "： " + ScheduledServiceImpl.class.getName() + ": say hello3 " + count++);
    }

    @Scheduled(fixedRate = 5000)
    // @Scheduled(cron = "0/5 * * * * ?")
    public void sayHello4() {
        try {
            TimeUnit.SECONDS.sleep(10);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        // 每 n 毫秒运行一次计划任务，它不会检查任务之前的任何执行情况
        System.out.println(simpleDateFormat.format(new Date()) + ":" + Thread.currentThread().getName() + "： " + ScheduledServiceImpl.class.getName() + ": say hello4 " + count++);
    }
}
